package com.weiyuwqj.api.tool;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
import java.util.Map;
/*
* Created on 2005-4-7
 *
 */

/**
 * 测试FreeMarker.
 *
 * @author scud
 *
 */
public class FreeMarkerTool
{

    private Configuration freemarker_cfg = null;

    /**
     * 获取freemarker的配置. freemarker本身支持classpath,目录和从ServletContext获取.
     */
    protected Configuration getFreeMarkerCFG()
    {
        if (null == freemarker_cfg)
        {
            // Initialize the FreeMarker configuration;
            // - Create a configuration instance
            freemarker_cfg = new Configuration();

            // - FreeMarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等

            //htmlskin是放在classpath下的一个目录
            freemarker_cfg.setDefaultEncoding("UTF-8");
            try {
                freemarker_cfg.setDirectoryForTemplateLoading(new File(this.getClass().getClassLoader().getResource("/").getPath()+"../ftl"));
	            //freemarker_cfg.setDirectoryForTemplateLoading(new File("F:/template"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return freemarker_cfg;
    }

    /**
     * 生成静态文件.
     *
     * @param templateFileName 模板文件名,相对htmlskin路径,例如"/tpxw/view.ftl"
     * @param propMap 用于处理模板的属性Object映射
     * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/tpxw/1/2005/4/"
     * @param htmlFileName 要生成的文件名,例如 "1.htm"
     */
    public String geneHtmlFile(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName )
    {
        //@todo 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用
        String sRootDir = this.getClass().getClassLoader().getResource("/").getPath()+"../" ;
	    //String sRootDir = "F:\\";
	    try
        {
            Template t = getFreeMarkerCFG().getTemplate(templateFileName,"UTF-8");

            //如果根路径存在,则递归创建子目录
            creatDirs(sRootDir,htmlFilePath);

            File afile = new File(sRootDir +"/" +htmlFilePath + "/" + htmlFileName);

            FileOutputStream fos = new FileOutputStream(afile);

            Writer out = new BufferedWriter(new OutputStreamWriter(fos,"UTF-8"));

            t.process(propMap, out);

            out.flush();
        }
        catch (TemplateException e)
        {
            System.out.println("Error while processing FreeMarker template " + templateFileName);
            System.out.println(e);
            return null;
        }
        catch (IOException e)
        {
            System.out.println("Error while generate Static Html File " + htmlFileName);
            System.out.println(e);
            return null;
        }

        return sRootDir ;
    }



    /**
     * 创建多级目录
     *
     * @param aParentDir String
     * @param aSubDir  以 / 开头
     * @return boolean 是否成功
     */
    public static boolean creatDirs(String aParentDir, String aSubDir)
    {
        File aFile = new File(aParentDir);
        if (aFile.exists())
        {
            File aSubFile = new File(aParentDir + aSubDir);
            if (!aSubFile.exists())
            {
                return aSubFile.mkdirs();
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }



}